package com.casa_apoio.estoque.suport;

import com.casa_apoio.estoque.mode.dao.ProdutoDAO;
import com.casa_apoio.estoque.mode.dao.SaidaDAO;
import com.casa_apoio.estoque.mode.entity.CabEstoque;
import com.casa_apoio.estoque.mode.entity.Produto;
import com.casa_apoio.estoque.mode.entity.Saida;
import com.casa_apoio.util.FacesContextUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@ViewScoped
public class RelatorioSaida implements Serializable {

    private static final long serialVersionUID = 1L;
    private StreamedContent arquivoRetorno;
    private StreamedContent arquivoRetornoProduto;
    private Saida saida;
    private List<Saida> saidas;
    private List<Produto> produtos;
    private Date dataInicio, dataFinal;

    private SaidaDAO saidaDAO() {
        SaidaDAO<Saida> dao = new SaidaDAO<Saida>(Saida.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private ProdutoDAO produtoDAO() {
        ProdutoDAO<Produto> produtoDAO = new ProdutoDAO<Produto>(Produto.class, FacesContextUtil.getRequestSession());
        return produtoDAO;
    }

    public String saidaProdutoPeriodo() {
        saidas = saidaDAO().listaSaidaProdutoPeriodo(dataInicio, dataFinal);
        return null;
    }

    public StreamedContent getArquivoRetorno() throws FileNotFoundException, IOException, DocumentException {
        saidas = saidaDAO().listaSaidaProdutoPeriodo(dataInicio, dataFinal);
        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("CASA DE APOIO SANTA MARIA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);

        SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy");
        Paragraph p = new Paragraph("Relatório de Saída de Produtos            Período " + sfd.format(dataInicio) + " á " + sfd.format(dataFinal));
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);
        try {
            Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
            Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);
            if (saidas.size() > 0) {

                PdfPTable table = new PdfPTable(new float[]{0.03f, 0.03f, 0.15f, 0.02f, 0.03f});

                table.setSpacingBefore(5.0f);
                table.setWidthPercentage(100.0f);

                table.setHorizontalAlignment(Element.ALIGN_LEFT);

                table.addCell(new Phrase("Cód. Produto", fh));
                table.addCell(new Phrase("DT. Entrada", fh));
                table.addCell(new Phrase("Produto", fh));
                table.addCell(new Phrase("Qtde", fh));
                table.addCell(new Phrase("Unidade", fh));

                for (Saida s : saidas) {
                    table.addCell(new Phrase(String.valueOf(s.getProduto().getIdProduto()), fc));
                    table.addCell(new Phrase(String.valueOf(sfd.format(s.getData())), fc));
                    table.addCell(new Phrase(s.getProduto().getDescricao(), fc));
                    table.addCell(new Phrase(String.valueOf(s.getQuantidade()), fc));
                    table.addCell(new Phrase(String.valueOf(s.getProduto().getUnidade()), fc));
                }
                document.add(table);
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar Gerar o Relatório", "Erro"));
        }
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetorno = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetorno;
    }

    public StreamedContent getArquivoRetornoProduto() throws FileNotFoundException, IOException, DocumentException {
        produtos = produtoDAO().listaProdutos();
        System.out.println(">>>>>> CASA DE APOIO SANTA MARIA <<<<<<<" + produtos.size());
        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("CASA DE APOIO SANTA MARIA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);

        SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy");
        Paragraph p = new Paragraph("Relatório de Saída de Produtos            Período " + sfd.format(dataInicio) + " á " + sfd.format(dataFinal));
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);

        try {
            System.out.println(">>>>>> ENTRO NO TRY <<<<<<<");
            Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
            Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);

            if (produtos.size() > 0) {
                System.out.println(">>>>>> ENTRO NO IF  <<<<<<<" + produtos.size());
                PdfPTable table = new PdfPTable(new float[]{0.03f, 0.15f, 0.02f, 0.03f});

                table.setSpacingBefore(5.0f);
                table.setWidthPercentage(100.0f);

                table.setHorizontalAlignment(Element.ALIGN_LEFT);
                System.out.println(">>>>>> CABEÇALHAO  <<<<<<<" + produtos.size());
                table.addCell(new Phrase("Cód. Produto", fh));
                table.addCell(new Phrase("Produto", fh));
                table.addCell(new Phrase("Qtde", fh));
                table.addCell(new Phrase("Unidade", fh));
                System.out.println(">>>>>> ANTES FOR LISTA DE PRODUTOS  <<<<<<<" + produtos.size());

                for (Produto pro : produtos) {
                    System.out.println(">>>>>> ENTRO NO FOR PRODUTOS  <<<<<<<");
                    int soma = 0;
                    saidas = saidaDAO().listaSaidaProduto(dataInicio, dataFinal, pro.getIdProduto());

                    for (Saida sa : saidas) {
                        System.out.println(">>>>>> ENTRO NO FOR SAIDAS  <<<<<<<");
                        soma += sa.getQuantidade();
                    }
                    System.out.println(">>>>>> ANTES DE ADDcELL  <<<<<<<");
                    table.addCell(new Phrase(String.valueOf(pro.getIdProduto()), fc));
                    table.addCell(new Phrase(pro.getDescricao(), fc));
                    table.addCell(new Phrase(String.valueOf(soma), fc));
                    table.addCell(new Phrase(pro.getUnidade(), fc));
                }
                document.add(table);
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar Gerar o Relatório", "Erro"));
        }
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetorno = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetorno;
    }

    public Saida getSaida() {
        return saida;
    }

    public void setSaida(Saida saida) {
        this.saida = saida;
    }

    public List<Saida> getSaidas() {
        return saidas;
    }

    public void setSaidas(List<Saida> saidas) {
        this.saidas = saidas;
    }

    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    public Date getDataFinal() {
        return dataFinal;
    }

    public void setDataFinal(Date dataFinal) {
        this.dataFinal = dataFinal;
    }

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }

}
